package com.xscha.tableforge.constants;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 日期格式常量
 */
public class DateFormatConstants {

    // 日期格式
    public static final String DEFAULT_DATE_FORMAT = "本地 (2025-03-13)";
    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";

    // 日期时间格式
    public static final String DEFAULT_DATETIME_FORMAT = "本地 (2025-03-13 14:30:00)";
    public static final String DEFAULT_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    // 时间格式
    public static final String DEFAULT_TIME_FORMAT = "24小时制 (14:30:00)";
    public static final String DEFAULT_TIME_PATTERN = "HH:mm:ss";

    // 默认时区
    public static final String DEFAULT_TIMEZONE = "Asia/Shanghai";
    public static final String DEFAULT_TIMEZONE_DISPLAY = "中国标准时间 (UTC+8)";

    /**
     * 获取日期格式列表
     */
    public static List<Map<String, String>> getDateFormats() {
        List<Map<String, String>> formats = new ArrayList<>();
        formats.add(createFormatOption("本地 (2025-03-13)", "yyyy-MM-dd"));
        formats.add(createFormatOption("语义化 (2025 年 3 月 13 日)", "yyyy 年 M 月 d 日"));
        formats.add(createFormatOption("美国 (3/13/2025)", "M/d/yyyy"));
        formats.add(createFormatOption("欧洲 (13/3/2025)", "d/M/yyyy"));
        formats.add(createFormatOption("亚洲 (2025/03/13)", "yyyy/MM/dd"));
        formats.add(createFormatOption("年/月 (2025-03)", "yyyy-MM"));
        formats.add(createFormatOption("月/日 (03-13)", "MM-dd"));
        formats.add(createFormatOption("年 (2025)", "yyyy"));
        formats.add(createFormatOption("月 (03)", "MM"));
        formats.add(createFormatOption("日 (13)", "dd"));
        return formats;
    }

    /**
     * 获取日期时间格式列表
     */
    public static List<Map<String, String>> getDateTimeFormats() {
        List<Map<String, String>> formats = new ArrayList<>();
        formats.add(createFormatOption("本地 (2025-03-13 14:30:00)", "yyyy-MM-dd HH:mm:ss"));
        formats.add(createFormatOption("ISO (2025-03-13T14:30:00)", "yyyy-MM-dd'T'HH:mm:ss"));
        formats.add(createFormatOption("语义化 (2025年3月13日 14时30分)", "yyyy年M月d日 HH时mm分"));
        formats.add(createFormatOption("美国 (3/13/2025 2:30 PM)", "M/d/yyyy h:mm a"));
        formats.add(createFormatOption("欧洲 (13/3/2025 14:30)", "d/M/yyyy HH:mm"));
        return formats;
    }

    /**
     * 获取时间格式列表
     */
    public static List<Map<String, String>> getTimeFormats() {
        List<Map<String, String>> formats = new ArrayList<>();
        formats.add(createFormatOption("24小时制 (14:30:00)", "HH:mm:ss"));
        formats.add(createFormatOption("24小时制 (14:30)", "HH:mm"));
        formats.add(createFormatOption("12小时制 (2:30:00 PM)", "h:mm:ss a"));
        formats.add(createFormatOption("12小时制 (2:30 PM)", "h:mm a"));
        return formats;
    }

    /**
     * 获取时区列表
     */
    public static List<Map<String, String>> getTimeZones() {
        List<Map<String, String>> timeZones = new ArrayList<>();
        timeZones.add(createTimeZoneOption("Asia/Shanghai", "中国标准时间 (UTC+8)"));
        timeZones.add(createTimeZoneOption("UTC", "协调世界时 (UTC)"));
        timeZones.add(createTimeZoneOption("America/New_York", "美国东部时间 (UTC-5/UTC-4)"));
        timeZones.add(createTimeZoneOption("Europe/London", "英国时间 (UTC+0/UTC+1)"));
        timeZones.add(createTimeZoneOption("Europe/Paris", "欧洲中部时间 (UTC+1/UTC+2)"));
        timeZones.add(createTimeZoneOption("Asia/Tokyo", "日本标准时间 (UTC+9)"));
        return timeZones;
    }

    /**
     * 创建格式选项
     */
    private static Map<String, String> createFormatOption(String displayName, String formatPattern) {
        Map<String, String> option = new HashMap<>();
        option.put("display", displayName);
        option.put("pattern", formatPattern);
        return option;
    }

    /**
     * 创建时区选项
     */
    private static Map<String, String> createTimeZoneOption(String zoneId, String displayName) {
        Map<String, String> option = new HashMap<>();
        option.put("id", zoneId);
        option.put("display", displayName);
        return option;
    }
}